package com.example.aspect;

import com.example.common.annotations.Sensitive;
import com.example.utils.DataMaskingUtil;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

@Aspect
@Component
public class SensitiveDataAspect {

    // 定义切点：拦截所有公共方法的返回值
    @Pointcut("execution(public * com.example.service.*.*(..))")
    public void methodPointcut() {

    }
    /**
     * 在目标方法执行完后，返回值被返回之前执行脱敏操作
     * @param result 目标方法的返回值
     */
    @AfterReturning(value = "methodPointcut()", returning = "result")
    public void handleSensitiveData(Object result) throws IllegalAccessException {
        if (result != null) {
            // 对返回值对象进行脱敏处理
            processSensitiveFields(result);
        }
    }

    /**
     * 脱敏方法，检查对象中的字段，如果字段上有 @Sensitive 注解，则对字段进行脱敏处理
     * @param obj 需要处理的对象
     */
    private void processSensitiveFields(Object obj) throws IllegalAccessException {
        if (obj == null) {
            return;
        }

        // 获取对象的所有字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            // 如果字段有 @Sensitive 注解
            if (field.isAnnotationPresent(Sensitive.class)) {
                field.setAccessible(true); // 设置为可访问

                Object fieldValue = field.get(obj);
                if (fieldValue instanceof String) {
                    String fieldStr = (String) fieldValue;

                    // 根据字段类型进行脱敏处理
                    if (fieldStr.contains("@")) {
                        // 如果是邮箱
                        field.set(obj, DataMaskingUtil.maskEmail(fieldStr));
                    } else if (fieldStr.matches("\\d+")) {
                        // 如果是手机号
                        field.set(obj, DataMaskingUtil.maskPhone(fieldStr));
                    }
                }
            }
        }
    }
}

